fix: optimize regressions from editions implementations #2066
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR contains 4 optimizations:
Instead of using resolved type information for feature resolution, we can use a more rudimentary approach. This was only being used to detect legacy groups, which are always in a very predictable location that's easy and efficient to lookup. Instead of forcing full type resolution of the entire graph, this change reduces the calls to only do feature resolution, which is very lightweight in comparison.
Cache the feature resolution state at the namespace level to avoid repeated calculations. Unless new objects are added, every object should only need to do feature resolution once.
As highlighted in Namespace
lookup
performance far worse than O(N) #2064,lookup
is wildly inefficient and profiling shows that it eats up most of the cpu costs forresolveAll
. We add some basic caching capabilities and reduce unnecessary recursion to avoid duplicate work, which shows up to a 30x speedup resolving a very large proto (from 3s to 0.1s).A bug was introduced during the development of editions in
ReflectionObject.resolve
that essentially disabled all caching of resolved type information. Restoring this means that repeated calls toresolveAll
should only force the rebuild of invalidated or unresolved objects, rather than the entire tree.This PR just captures the low hanging fruit to unblock the launch of editions support. There are likely many further optimizations that could be applied to both feature resolution and
lookup
.Fixes #2063